home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / dosutil / dump.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  3KB  |  108 lines

  1. /*
  2.  * A simple (but useful) hexidecimal/octal file dump utility
  3.  *
  4.  * Copyright 1990-1994 Dave Dunfield
  5.  * All rights reserved.
  6.  *
  7.  * Permission granted for personal (non-commercial) use only.
  8.  *
  9.  * Compile command: cc dump -fop
  10.  */
  11. #include <stdio.h>
  12.  
  13. char bpause = 0, fpause = 0, octal = 0;
  14. int lsize = 16;
  15.  
  16. /*
  17.  * Main program - dump file contents
  18.  */
  19. main(argc, argv)
  20.     int argc;
  21.     int *argv[];
  22. {
  23.     int i, size, addr, filecount;
  24.     char c, buffer[256], *ptr, *ptr1, *fnames[25];
  25.     char name[13];
  26.     int sizeh, sizel, attrs, time, date;
  27.     FILE *fp;
  28.  
  29.     if(argc < 2)
  30.         abort("\nUse: dump <filename*> -p -f -o\n\nCopyright 1990-1994 Dave Dunfield\nAll rights reserved.\n");
  31.  
  32.     /* Evaluate arguments & store filenames */
  33.     filecount = 0;
  34.     for(i=1; i < argc; ++i) {
  35.         switch(*argv[i]) {
  36.             case 'p-' :        /* Pause between blocks */
  37.                 bpause = -1;
  38.                 break;
  39.             case 'f-' :        /* Pause between files */
  40.                 fpause = -1;
  41.                 break;
  42.             case 'o-' :        /* Octal output */
  43.                 octal = -1;
  44.                 lsize = 8;
  45.                 break;
  46.             default:
  47.                 fnames[filecount++] = argv[i]; } }
  48.  
  49.     /* Step through filenames & display any matching files */
  50.     for(i = 0; i < filecount; ++i) {
  51.         if(find_first(ptr = ptr1 = fnames[i], -1, name, &sizeh, &sizel, &attrs, &time, &date))
  52.             fprintf(stderr,"Not found: %s\n", ptr);
  53.         else {
  54.             /* Determine directory path */
  55.             while(c = *ptr++)
  56.                 if((c == '\\') || (c == ':'))
  57.                     ptr1 = ptr;
  58.             *ptr1 = 0;
  59.             do {
  60.                 concat(buffer, fnames[i], name);    /* Create full pathname */
  61.                 if(!(fp = fopen(buffer, "rbv")))
  62.                     continue;
  63.                 if(fpause == 0x0f) {
  64.                     printf("Press <return> for dump of '%s'...", buffer);
  65.                     fgets(buffer, 256, stdin); }
  66.                 else
  67.                     printf("Dump of '%s'\n", buffer);
  68.                 fpause &= 0x0f;
  69.                 addr = 0;
  70.                 do {
  71.                     putc('\n', stdout);
  72.                     size = fread(buffer, 256, fp);
  73.                     dump(buffer, size, addr);
  74.                     if(bpause && (size == 256)) {
  75.                         printf("Press <return> for next page...");
  76.                         fgets(buffer, 256, stdin); }
  77.                     addr += 256; }
  78.                 while(size == 256);
  79.                 fclose(fp);
  80.                 putc('\n', stdout); }
  81.             while(!find_next(name, &sizeh, &sizel, &attrs, &time, &date)); } }
  82. }
  83.  
  84. /*
  85.  * Dump a buffer of memory with the specified address & size
  86.  */
  87. dump(buffer, size, addr)
  88.     unsigned char *buffer;
  89.     unsigned size, addr;
  90. {
  91.     unsigned i, j, c;
  92.  
  93.     for(i=0; i < size; i += lsize) {
  94.         printf(octal ? "%06o " : "%04x ", addr+i);
  95.         for(j=0; j < lsize; ++j) {                        /* Display HEX */
  96.             if(!(j & 0x03))
  97.                 putc(' ', stdout);
  98.             if((i+j) < size) {
  99.                 printf(octal ? "%03o " : "%02x ", buffer[j]); }
  100.             else
  101.                 fputs(octal ? "    " : "   ", stdout); }
  102.         putc(' ', stdout);
  103.         for(j=0; (j < lsize) && ((i+j) < size); ++j) {    /* Display ASCII */
  104.             c = *buffer++;
  105.             putc(((c >= ' ') && (c < 0x7f)) ? c : '.', stdout); }
  106.         putc('\n', stdout); }
  107. }
  108.